Android — APP 启动时间优化
前言
如果你仔细观察自己写的APP第一次启动的时候,发现有时中间会有黑屏,有时是白屏。造成这样的情况是什么原因呢?如下图:
那就要从APP启动方式开始说起。不过把握一点,那就是导致这种情况的主要原因就是因为APP启动时间过慢,导致View未被绘制完全。为了避免这种情况,我们要对APP启动做优化处理。所以,本篇文章的大致思路就是:
- APP 启动方式
- APP 启动时间测量
- 避免APP启动黑白屏
APP 启动方式
冷启动
APP 启动之前,系统没有为此 APP 创建独立进程。比如:设备启动后,第一次启动或者 APP 被移除后台进程再重启。启动流程大致如下:
点击 icon 加载 APP –> 立即显示白屏或黑屏等 –> Application onCreat –> Activity Init –> Activity onCreat –> 初始化数据,填充显示 View –> Activity onResume
热启动
当启动 APP 时,后台存在该应用的进程,这时候从已有的进程中启动,而不需要创建和初始化 Application ,直接创建和初始化它的 Launch Activity。比如:APP 按返回键退出或者按 home 键。
这个时候也就能解释APP启动为什么会出现黑白屏了?那是因为已经进入Acticity,但是还没加载到布局文件,所以就会显示windows窗口的背景。黑屏/白屏就是显示的windoes背景(这个就是theme的设置)。
APP 启动时间测量
- 通过 adb 命令测量APP冷启动时间:
1
| adb shell am start -W [packageName]/[packageName.MainActivity]
|
不过这里,要先把 adb.exe 的路径放在环境变量 path下,然后就可以在 AS 终端输入命令查看了。
1 2 3 4 5 6 7 8
| C:\Users\SSC\AndroidStudioProjects\Tools>adb shell am start -W com.example.ssc.tools/com.example.ssc.tools.WelcomeActivity Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.ssc.tools/.WelcomeActivity } Status: ok Activity: com.example.ssc.tools/.WelcomeActivity ThisTime: 141 TotalTime: 141 WaitTime: 149 Complete
|
- 从 Android 4.4 (API 19) 开始,Logcat 自动帮我们打印出应用的启动时间。这个时间值从应用启动 (创建进程) 开始计算,到完成视图的第一次绘制 (即 Activity 内容对用户可见) 为止。如:
1
| 11-27 00:23:12.091 593-617/system_process I/ActivityManager: Displayed com.example.ssc.tools/.MainActivity: +897ms
|
拒绝黑白屏
比较友好的方式就是通过windowBackground 属性 设置一个自定义样式来替换黑白屏。效果如下:
emmm,其实这张图可以换成应用的Logo,可以参考网易云音乐APP的启动。
首先新建一个名为 shape_launch.xml 的文件,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12
| <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque"> <item > <bitmap android:src="@mipmap/launch" android:gravity="center" /> </item> </layer-list>
|
然后自定义一个主题样式:
1 2 3 4 5
| <style name="LaunchStyle" parent="AppTheme"> <item name="android:windowBackground">@drawable/shape_launch</item> <!--<item name="windowActionBar">false</item>--> <!--<item name="windowNoTitle">true</item>--> </style>
|
之后在AndroidManifest文件中给启动的Activity设置这个主题样式。
最后最后,再把布局文件加载前将主题还原到默认:
1 2 3 4 5 6
| protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(R.style.AppTheme); setContentView(R.layout.activity_main); initView(); }
|
参考:
http://www.jianshu.com/p/1c9a18e49482
http://www.jianshu.com/p/e69d22ec0582
APP 启动时间优化方法详解
http://www.jianshu.com/p/add0d4a03914